home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / prodpack.zip / DB4PPSAM.EXE / BDCLINK.PRG < prev    next >
Text File  |  1993-05-11  |  46KB  |  1,571 lines

  1. *-- DBW - Dialog Box Workshop - BDCLINK.PRG
  2. PROCEDURE BDCLINK
  3. *----------------------------------------------------------------------------
  4. * NAME
  5. * DESCRIPTION
  6. *----------------------------------------------------------------------------
  7.   PRIVATE  cAlias, cWindow, lTalk, lSafety, cDialog, cHelpFile, cStartLib
  8.  
  9.   IF SET( "TALK" ) = "ON"
  10.     SET TALK OFF
  11.     lTalk = .T.
  12.   ELSE
  13.     lTalk = .F.
  14.   ENDIF
  15.  
  16.   lSafety = SET( "SAFETY" ) = "ON"
  17.   SET SAFETY OFF
  18.  
  19.   cWindow = WINDOW()
  20.   cAlias = ALIAS()
  21.  
  22.   *----------------------------------
  23.   *-- Setup the help system variables
  24.   *----------------------------------
  25.   lError = .F.
  26.   cHelpFile = "BDCDRIVE"
  27.   cDialog = "BDCLINK"
  28.   cDBBLib = "DBBLIB"
  29.  
  30.   *----------------------------------------------
  31.   *-- Setup the link to the DBB Procedure Library
  32.   *----------------------------------------------
  33.   ON ERROR lError = .T.
  34.   cStartLib = SET( "PROCEDURE" )
  35.   SET PROCEDURE TO ( cDBBLib )
  36.   IF lError
  37.     lError = .F.
  38.     SET PROCEDURE TO HOME() + cDBBLib
  39.     IF lError
  40.       *-- Display the error message in a windowed box
  41.       PRIVATE lc_anykey, lc_msg, lc_msglen, lc_win, ln_press, ln_width, ll_trap,;
  42.               ll_escape
  43.  
  44.       lc_anykey = [Press any key to continue...]
  45.       ln_press  = LEN( lc_anykey )
  46.       lc_msg    = [Could not locate procedure file: ] + cDBBLib
  47.       ln_msglen = LEN( lc_msg )
  48.       ln_width = 0
  49.       ll_escape = SET("ESCAPE") = "ON"
  50.       SET ESCAPE OFF
  51.  
  52.       *-- Determine the width needed for the window:
  53.       IF ln_msglen <= ln_press
  54.         ln_width = ln_press
  55.       ELSE
  56.         *-- Make sure the message fits in the window:
  57.         IF ln_msglen > 76
  58.           lc_msg = LEFT( lc_msg, 76 )
  59.           ln_msglen = 76
  60.         ENDIF
  61.         ln_width = ln_msglen
  62.       ENDIF
  63.       DEFINE WINDOW _err_box FROM 9, ((76 - ln_width) + .5) / 2 ;
  64.                     TO 15, (ln_width + 83) / 2 DOUBLE
  65.       ln_width = ( ln_width + 2 )
  66.  
  67.       *-- Display the message and prompt to the window and wait for a key press
  68.       ACTIVATE WINDOW _err_box
  69.       ? lc_msg AT ( ln_width - ln_msglen ) / 2
  70.       ?
  71.       ? lc_anykey AT ( ln_width - ln_press ) / 2
  72.       SET CONSOLE OFF
  73.       WAIT
  74.       SET CONSOLE ON
  75.  
  76.       *-- Clean up the window display and reactivate the previous window
  77.       RELEASE WINDOW _err_box
  78.  
  79.       IF ll_escape
  80.         SET ESCAPE ON
  81.       ELSE
  82.         SET ESCAPE OFF
  83.       ENDIF
  84.  
  85.     ENDIF
  86.   ENDIF
  87.   ON ERROR
  88.  
  89.   *---------------------------------
  90.   *-- Run the actual dialog box code
  91.   *---------------------------------
  92.   IF .NOT. lError
  93.     DO Dialog
  94.   ENDIF
  95.  
  96.   *----------------------------------
  97.   *-- Restore the startup environment
  98.   *----------------------------------
  99.   IF .NOT. ISBLANK( cStartLib )
  100.     SET PROCEDURE TO ( cStartLib )
  101.   ENDIF
  102.  
  103.   IF .NOT. ISBLANK( cAlias ) .AND. SELECT( cAlias ) > 0
  104.     SELECT ( cAlias )
  105.   ENDIF
  106.  
  107.   IF lSafety
  108.     SET SAFETY ON
  109.   ENDIF
  110.   IF lTalk
  111.     SET TALK ON
  112.   ENDIF
  113.   IF .NOT. ISBLANK( cWindow )
  114.     ACTIVATE WINDOW &cWindow
  115.   ENDIF
  116. RETURN
  117. *-- EOP: BDCLINK
  118.  
  119.  
  120. PROCEDURE Dialog
  121. *----------------------------------------------------------------------------
  122. * NAME
  123. *   Dialog -
  124. *
  125. * DESCRIPTION
  126. *
  127. *----------------------------------------------------------------------------
  128.  
  129.   *---------------------------------------
  130.   *-- Temporary for now, message varaibles
  131.   *---------------------------------------
  132.   DLN_OK       = -500
  133.   DLN_CANCEL   = -501
  134.   DLN_HELP     = -502
  135.  
  136.   WM_PAINT    = 15                      && Notification to repaint client area
  137.   WM_CLOSE    = 16                      && Note that user selected close button
  138.   WM_DRAWITEM = 43                      && Notification to the owner of an
  139.  
  140.   BN_CLICKED  = 0
  141.   BN_PAINT    = 1
  142.   BN_HILITE   = 2
  143.   BN_UNHILITE = 3
  144.   BN_DISABLE  = 4
  145.   BN_DEFAULT  = 6
  146.   BN_PRESSED  = 7
  147.   BN_COLOR    = 8
  148.   SE_SHADOW   = -100
  149.  
  150.   EN_SETFOCU  = 1
  151.   EN_KILLFOC  = 2
  152.  
  153.   CB_SELECTS  = 13
  154.   CB_SHOWDRO  = 15
  155.   CB_HIDELST  = 25
  156.  
  157.   CBN_SELCHAN = 1
  158.   CBN_DBLCLK  = 2
  159.   CBN_SETFOCU = 3
  160.   CBN_KILLFOC = 4
  161.   CBN_EDITCHA = 5
  162.   CBN_EDITUPD = 6
  163.   CBN_DROPDOW = 7
  164.   CBN_INLIST  = 8
  165.  
  166.   LBN_SELCHA  =  1
  167.   LBN_DBLCLK  =  2
  168.   LBN_SELCAN  =  3
  169.   LBN_SETFOC  =  4
  170.   LBN_KILLFO  =  5
  171.  
  172.   KB_TAB = 9
  173.   KB_ENTER = 13
  174.   KB_SPACE = 32
  175.   KB_SHIFTTAB = -400
  176.   KB_UPARROW = 5
  177.   KB_DOWNARROW = 24
  178.   KB_LEFTARROW = 19
  179.   KB_RTARROW = 4
  180.   KB_F1 = 28
  181.   KB_ESC = 27
  182.   KB_MOUSE = -100
  183.   KB_CTRLW = 23
  184.  
  185.   *--------------------
  186.   *-- Working variables
  187.   *--------------------
  188.   PRIVATE nCurrent, nCurrGrp, lButtAct, nMRow, nMCol, nMsEvent, nDlgDef, nAccel
  189.   PRIVATE n1stGrp, nCancelBt
  190.   nCurrent  = 0                         && Current dialog object id
  191.   nCurrGrp  = 0                         && Current group id for object id
  192.   lButtAct  = .F.                       && Dialog has a button active
  193.   nMRow     = -1
  194.   nMCol     = -1
  195.   nMsEvent  = 0
  196.   nDlgDef   = 0
  197.   nAccel    = 0
  198.   n1stGrp   = 0
  199.   nCancelBt = 0                         && Id for cancel button
  200.  
  201.   PRIVATE nDefButt, nMess
  202.   nDefButt  = 0                         && Number of object with default button
  203.   nMess     = 0
  204.  
  205.   PRIVATE cOldFClr, cOldBClr, cOldHClr, cOldMClr, cOldNClr, cOldTClr
  206.   cOldFClr = _ColorChk( "F" )
  207.   cOldBClr = _ColorChk( "B" )
  208.   cOldHClr = _ColorChk( "H" )
  209.   cOldMClr = _ColorChk( "M" )
  210.   cOldNClr = _ColorChk( "N" )
  211.   cOldTClr = _ColorChk( "T" )
  212.  
  213.   SET COLOR OF FIELDS TO w+/b
  214.   SET COLOR OF BOX TO n/gb
  215.   SET COLOR OF HIGH TO w+/g
  216.   SET COLOR OF MESS TO n/gb
  217.   SET COLOR OF TITLE TO n/gb
  218.  
  219.   *------------------------
  220.   *-- Close Icon for window
  221.   *------------------------
  222.   PRIVATE nRowCls, nOrigRow, nOrigCol, nXoffset, nYOffset, nCol, ;
  223.           nHigh, nWidth, nLColCls, nRColCls, nRWinCol, cField, cClass, nScreen
  224.   cField = ""
  225.   cClass = ""
  226.  
  227.   nRowCls   = 9
  228.   nOrigRow  = 9
  229.   nOrigCol  = 15
  230.   nXOffset  = 0
  231.   nYOffset  = 0
  232.   nCol      = 15
  233.   nHigh     = 14
  234.   nWidth    = 54
  235.   nLColCls  = 17
  236.   nRColCls  = 19
  237.   nRWinCol  = 68
  238.   nScreen = IIF( "50" $ SET("DISPLAY"), 49, ;
  239.                 IIF( "43" $ SET("DISPLAY"), 42, 24 ) )
  240.   IF SET( "STATUS" ) = "ON"
  241.     nScreen = nScreen - 3
  242.   ENDIF
  243.  
  244.   PRIVATE nClkBox, nClkObj, aClkBox, aClkObj, aObjPoint
  245.   *--------------------------------------------------
  246.   *-- Get the number of clickable boxes in the dialog
  247.   *--------------------------------------------------
  248.   nClkBox = 0
  249.  
  250.   *--------------------------------------------------
  251.   *-- Get the number of clickable items in the dialog
  252.   *--------------------------------------------------
  253.   nClkObj = 6
  254.   DECLARE aClkObj[ 6 , 13 ]
  255.   aClkObj[ 1 , 1 ] = 12                 && Row
  256.   aClkObj[ 1 , 2 ] = 38                 && Col
  257.   aClkObj[ 1 , 3 ] = 62                 && Decimals
  258.   aClkObj[ 1 , 4 ] = 7                  && CurrentId
  259.   aClkObj[ 1 , 5 ] = 6                  && GroupId
  260.   aClkObj[ 1 , 6 ] = 13                 && NextId
  261.   aClkObj[ 1 , 7 ] = 28                 && PrevId
  262.   aClkObj[ 1 , 8 ] = " "                && PickKey
  263.   aClkObj[ 1 , 9 ] = 7                  && Previous item in group
  264.   aClkObj[ 1 ,10 ] = 7                  && Next item in group
  265.   aClkObj[ 1 ,11 ] = "EF_EXEP_1"         && XXXXXXXXXXXXXXXXXXXXXXXXX
  266.   aClkObj[ 1 ,12 ] = []
  267.   aClkObj[ 1 ,13 ] = []
  268.  
  269.   aClkObj[ 2 , 1 ] = 14                 && Row
  270.   aClkObj[ 2 , 2 ] = 38                 && Col
  271.   aClkObj[ 2 , 3 ] = 62                 && Decimals
  272.   aClkObj[ 2 , 4 ] = 13                 && CurrentId
  273.   aClkObj[ 2 , 5 ] = 12                 && GroupId
  274.   aClkObj[ 2 , 6 ] = 19                 && NextId
  275.   aClkObj[ 2 , 7 ] = 7                  && PrevId
  276.   aClkObj[ 2 , 8 ] = " "                && PickKey
  277.   aClkObj[ 2 , 9 ] = 13                 && Previous item in group
  278.   aClkObj[ 2 ,10 ] = 13                 && Next item in group
  279.   aClkObj[ 2 ,11 ] = "EF_CONF_1"         && XXXXXXXXXXXXXXXXXXXXXXXXX
  280.   aClkObj[ 2 ,12 ] = []
  281.   aClkObj[ 2 ,13 ] = []
  282.  
  283.   aClkObj[ 3 , 1 ] = 16                 && Row
  284.   aClkObj[ 3 , 2 ] = 38                 && Col
  285.   aClkObj[ 3 , 3 ] = 62                 && Decimals
  286.   aClkObj[ 3 , 4 ] = 19                 && CurrentId
  287.   aClkObj[ 3 , 5 ] = 18                 && GroupId
  288.   aClkObj[ 3 , 6 ] = 26                 && NextId
  289.   aClkObj[ 3 , 7 ] = 13                 && PrevId
  290.   aClkObj[ 3 , 8 ] = " "                && PickKey
  291.   aClkObj[ 3 , 9 ] = 19                 && Previous item in group
  292.   aClkObj[ 3 ,10 ] = 19                 && Next item in group
  293.   aClkObj[ 3 ,11 ] = "EF_EXEF_1"         && XXXXXXXXXXXXXXXXXXXXXXXXX
  294.   aClkObj[ 3 ,12 ] = []
  295.   aClkObj[ 3 ,13 ] = []
  296.  
  297.   aClkObj[ 4 , 1 ] = 19                 && Row
  298.   aClkObj[ 4 , 2 ] = 26                 && Col
  299.   aClkObj[ 4 , 3 ] = 33                 && Decimals
  300.   aClkObj[ 4 , 4 ] = 26                 && CurrentId
  301.   aClkObj[ 4 , 5 ] = 26                 && GroupId
  302.   aClkObj[ 4 , 6 ] = 27                 && NextId
  303.   aClkObj[ 4 , 7 ] = 19                 && PrevId
  304.   aClkObj[ 4 , 8 ] = " "                && PickKey
  305.   aClkObj[ 4 , 9 ] = 26                 && Previous item in group
  306.   aClkObj[ 4 ,10 ] = 26                 && Next item in group
  307.   aClkObj[ 4 ,11 ] = "BT_OK"             &&    Ok
  308.   aClkObj[ 4 ,12 ] = []
  309.   aClkObj[ 4 ,13 ] = []
  310.  
  311.   aClkObj[ 5 , 1 ] = 19                 && Row
  312.   aClkObj[ 5 , 2 ] = 38                 && Col
  313.   aClkObj[ 5 , 3 ] = 45                 && Decimals
  314.   aClkObj[ 5 , 4 ] = 27                 && CurrentId
  315.   aClkObj[ 5 , 5 ] = 27                 && GroupId
  316.   aClkObj[ 5 , 6 ] = 28                 && NextId
  317.   aClkObj[ 5 , 7 ] = 26                 && PrevId
  318.   aClkObj[ 5 , 8 ] = " "                && PickKey
  319.   aClkObj[ 5 , 9 ] = 27                 && Previous item in group
  320.   aClkObj[ 5 ,10 ] = 27                 && Next item in group
  321.   aClkObj[ 5 ,11 ] = "BT_CANCEL"         &&  Cancel
  322.   aClkObj[ 5 ,12 ] = []
  323.   aClkObj[ 5 ,13 ] = []
  324.  
  325.   nCancelBt = 27
  326.  
  327.   aClkObj[ 6 , 1 ] = 19                 && Row
  328.   aClkObj[ 6 , 2 ] = 50                 && Col
  329.   aClkObj[ 6 , 3 ] = 57                 && Decimals
  330.   aClkObj[ 6 , 4 ] = 28                 && CurrentId
  331.   aClkObj[ 6 , 5 ] = 28                 && GroupId
  332.   aClkObj[ 6 , 6 ] = 7                  && NextId
  333.   aClkObj[ 6 , 7 ] = 27                 && PrevId
  334.   aClkObj[ 6 , 8 ] = " "                && PickKey
  335.   aClkObj[ 6 , 9 ] = 28                 && Previous item in group
  336.   aClkObj[ 6 ,10 ] = 28                 && Next item in group
  337.   aClkObj[ 6 ,11 ] = "BT_HELP"           &&   Help
  338.   aClkObj[ 6 ,12 ] = []
  339.   aClkObj[ 6 ,13 ] = []
  340.  
  341.  
  342.   *-------------------------------------------------------------
  343.   *-- Setup object pointers in to the current object array above
  344.   *-------------------------------------------------------------
  345.   DECLARE aObjPoint[ 33 ]
  346.   aObjPoint[ 7 ] = 1
  347.   aObjPoint[ 13 ] = 2
  348.   aObjPoint[ 19 ] = 3
  349.   aObjPoint[ 26 ] = 4
  350.   aObjPoint[ 27 ] = 5
  351.   aObjPoint[ 28 ] = 6
  352.  
  353.   *-------------------------------------------------------------------
  354.   *-- Setup private memory variables for object states (from InitObjs)
  355.   *-- First variable with the object memvar name contains the value
  356.   *-- for the object.  The second varaible, if present, indicates
  357.   *-- the id of the object previously active in the group.
  358.   *-------------------------------------------------------------------
  359.   PRIVATE ef_exep_1
  360.   ef_exep_1   = ""
  361.   PRIVATE ef_conf_1
  362.   ef_conf_1   = ""
  363.   PRIVATE ef_exef_1
  364.   ef_exef_1   = ""
  365.   PRIVATE bt_ok
  366.   bt_ok       = ""
  367.   PRIVATE bt_cancel
  368.   bt_cancel   = ""
  369.   PRIVATE bt_help
  370.   bt_help     = ""
  371.  
  372.   DO InitObjs
  373.  
  374.   DO DrawDial                           && Draw all the dialog objects
  375.  
  376.   *--------------------------------
  377.   *-- Set focus to the first object
  378.   *--------------------------------
  379.   DO GetNext WITH nCurrent, .T.
  380.  
  381.   *-- The message loop
  382.   nMess = 0
  383.   DO WHILE .NOT. GetMess()
  384.     DO Dispatch
  385.     IF nMess = DLN_OK .OR. nMess = DLN_CANCEL
  386.       EXIT
  387.     ENDIF
  388.  
  389.   ENDDO
  390.  
  391.   IF nMess = DLN_OK
  392.     DO PostVals
  393.     FXL_Cancel = .F.
  394.   ELSE
  395.     FXL_Cancel = .T.
  396.   ENDIF
  397.  
  398.   RELEASE WINDOW BDCLINK
  399.   RESTORE SCREEN FROM BDCLINK
  400.   RELEASE SCREEN BDCLINK
  401.  
  402.   DO ReleObjs
  403.  
  404.   SET COLOR OF FIELDS TO &cOldFClr
  405.   SET COLOR OF BOX TO &cOldBClr
  406.   SET COLOR OF HIGH TO &cOldHClr
  407.   SET COLOR OF MESS TO &cOldMClr
  408.   SET COLOR OF TITLE TO &cOldTClr
  409.   SET CURSOR ON
  410.  
  411. RETURN
  412. *-- EOP: Dialog
  413.  
  414. PROCEDURE InitObjs
  415. *----------------------------------------------------------------------------
  416. * NAME
  417. *   InitObjs - Scan the design DBF file and initialize the object variables
  418. *
  419. * DESCRIPTION
  420. *
  421. *----------------------------------------------------------------------------
  422.   PRIVATE cField, cClass, cDefault, Value, lInitDef
  423.  
  424.   *--------------------------------------------------
  425.   *-- Determine if an initialization array is present
  426.   *--------------------------------------------------
  427.   lInitDef = TYPE( "BDCLINK[1]" ) <> "U"
  428.  
  429.   *-------------------------------
  430.   *-- Set the default button value
  431.   *-------------------------------
  432.   nDlgDef =  26
  433.  
  434.   *-----------------------------------------------------------------
  435.   *-- If the Initialize array is present, then set the object values
  436.   *-- based on the array.
  437.   *-----------------------------------------------------------------
  438.   IF lInitDef
  439.     EF_EXEP_1 = BDCLINK[ 1 ]
  440.     EF_CONF_1 = BDCLINK[ 2 ]
  441.     EF_EXEF_1 = BDCLINK[ 3 ]
  442.     BT_OK = BDCLINK[ 4 ]
  443.     BT_CANCEL = BDCLINK[ 5 ]
  444.     BT_HELP = BDCLINK[ 6 ]
  445.   ELSE
  446.     *--------------------------------------------------------
  447.     *-- Otherwise, use the values stored in the resource file
  448.     *--------------------------------------------------------
  449.     EF_EXEP_1 = "                         "
  450.     EF_CONF_1 = "                         "
  451.     EF_EXEF_1 = "                         "
  452.     BT_OK = .T.
  453.     BT_CANCEL = .F.
  454.     BT_HELP = .F.
  455.   ENDIF
  456.   nCurrent  = 7                         && Current dialog object id
  457.   nCurrGrp  = 6                         && Current group id for object id
  458.   n1stGrp   = 6
  459.  
  460. RETURN
  461. *-- EOP: InitObjs
  462.  
  463. PROCEDURE DrawDial
  464. *----------------------------------------------------------------------------
  465. * NAME
  466. *   DrawDial -
  467. *
  468. * DESCRIPTION
  469. *
  470. *----------------------------------------------------------------------------
  471.   PRIVATE lInitDef
  472.   lInitDef = TYPE( "BDCLINK[1]" ) <> "U"
  473.   IF FILE( "BDCLINK.WIN" ) .AND. ( .NOT. lInitDef .OR. ;
  474.      ( TYPE( "FXL_NoChng" ) = "L" .AND. FXL_NoChng ) )
  475.     *--------------------
  476.     *-- Dialog box shadow
  477.     *--------------------
  478.     SAVE SCREEN TO BDCLINK
  479.     ACTIVATE SCREEN
  480.     @ 10, 16 FILL TO 23, 69
  481.  
  482.     RESTORE WINDOW BDCLINK FROM BDCLINK
  483.     ACTIVATE WINDOW BDCLINK
  484.   ELSE
  485.     *-------------------------
  486.     *-- Draw the dialog window
  487.     *-------------------------
  488.     *--------------------
  489.     *-- Dialog box shadow
  490.     *--------------------
  491.     SAVE SCREEN TO BDCLINK
  492.     ACTIVATE SCREEN
  493.     @ 10, 16 FILL TO 23, 69
  494.  
  495.     DEFINE WINDOW BDCLINK FROM  9,15 TO 22,68 NONE COLOR n/w
  496.     ACTIVATE WINDOW BDCLINK
  497.     @ 0, 0 TO 13 , 53 DOUBLE COLOR w+/w
  498.     *------------------------
  499.     *-- Close Icon for window
  500.     *------------------------
  501.     @ 0, 2 SAY "[ ]" COLOR w+/w
  502.     @ 0, 3 SAY CHR( 254 ) COLOR g+/w
  503.  
  504.     *---------------------------------
  505.     *-- Draw the other control objects
  506.     *---------------------------------
  507.     @ 0,17 SAY "[  Linker Options  ]" COLOR w+/w
  508.     @ 2,3 SAY "┌──────────────────────────────────────────────" COLOR n/w
  509.     @ 2,50 SAY "┐" COLOR w+/w
  510.     @ 3,3 SAY "│" COLOR n/w
  511.     @ 3,50 SAY "│" COLOR w+/w
  512.     @ 4,3 SAY "│" COLOR n/w
  513.     @ 4,50 SAY "│" COLOR w+/w
  514.     @ 5,3 SAY "│" COLOR n/w
  515.     @ 5,50 SAY "│" COLOR w+/w
  516.     @ 6,3 SAY "│" COLOR n/w
  517.     @ 6,50 SAY "│" COLOR w+/w
  518.     @ 7,3 SAY "│" COLOR n/w
  519.     @ 7,50 SAY "│" COLOR w+/w
  520.     @ 8,3 SAY "└" COLOR n/w
  521.     @ 8,4 SAY "──────────────────────────────────────────────┘" COLOR w+/w
  522.     @ 9,9 SAY "┌───────────────────────────────────" COLOR w+/w
  523.     @ 9,45 SAY "┐" COLOR n/w
  524.     @ 10,9 SAY "│" COLOR w+/w
  525.     @ 10,45 SAY "│" COLOR n/w
  526.     @ 11,9 SAY "│" COLOR w+/w
  527.     @ 11,45 SAY "│" COLOR n/w
  528.     @ 12,9 SAY "└" COLOR w+/w
  529.     @ 12,10 SAY "───────────────────────────────────┘" COLOR n/w
  530.     DO TStatic WITH WM_PAINT, BN_PAINT, 6
  531.     DO TEdit WITH WM_PAINT, EN_KILLFOC, 7
  532.     DO TStatic WITH WM_PAINT, BN_PAINT, 12
  533.     DO TEdit WITH WM_PAINT, EN_KILLFOC, 13
  534.     DO TStatic WITH WM_PAINT, BN_PAINT, 18
  535.     DO TEdit WITH WM_PAINT, EN_KILLFOC, 19
  536.     DO TButton WITH WM_PAINT, BN_PAINT, 26
  537.     DO TButton WITH WM_PAINT, SE_SHADOW, 26
  538.     DO TButton WITH WM_PAINT, BN_PAINT, 27
  539.     DO TButton WITH WM_PAINT, SE_SHADOW, 27
  540.     DO TButton WITH WM_PAINT, BN_PAINT, 28
  541.     DO TButton WITH WM_PAINT, SE_SHADOW, 28
  542.     IF .NOT. lInitDef
  543.       SAVE WINDOW BDCLINK TO BDCLINK
  544.     ENDIF
  545.   ENDIF
  546. RETURN
  547. *-- EOP: DrawDial
  548.  
  549.  
  550.  
  551. PROCEDURE TStatic
  552. PARAMETERS pn_msg, pc_data, pnObject
  553. *----------------------------------------------------------------------------
  554. * NAME
  555. *   TStatic -
  556. *
  557. * DESCRIPTION
  558. *
  559. * PARAMETERS
  560. *   pn_msg     =
  561. *   pc_data    =
  562. *   pnObject   =
  563. *
  564. *----------------------------------------------------------------------------
  565.   DO CASE
  566.     CASE pnObject = 6
  567.       DO CASE
  568.         CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  569.           @ 3, 5 SAY 'Execute program' COLOR n/w
  570.         CASE pc_data = BN_HILITE
  571.           @ 3, 5 SAY 'Execute program' COLOR w+/w
  572.         CASE pc_data = BN_DISABLE
  573.           @ 3, 5 SAY 'Execute program' COLOR n+/w
  574.         CASE pc_data = BN_COLOR
  575.           @ 3, 5 SAY "~Execute program" COLOR n/w
  576.       ENDCASE
  577.       IF pc_data <> BN_DISABLE
  578.         @ 3, 5 SAY "E" COLOR gr+/w
  579.       ENDIF
  580.     CASE pnObject = 12
  581.       DO CASE
  582.         CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  583.           @ 5, 6 SAY 'Config.DB file' COLOR n/w
  584.         CASE pc_data = BN_HILITE
  585.           @ 5, 6 SAY 'Config.DB file' COLOR w+/w
  586.         CASE pc_data = BN_DISABLE
  587.           @ 5, 6 SAY 'Config.DB file' COLOR n+/w
  588.         CASE pc_data = BN_COLOR
  589.           @ 5, 6 SAY "~Config.DB file" COLOR n/w
  590.       ENDCASE
  591.       IF pc_data <> BN_DISABLE
  592.         @ 5, 6 SAY "C" COLOR gr+/w
  593.       ENDIF
  594.     CASE pnObject = 18
  595.       DO CASE
  596.         CASE pc_data = BN_PAINT .OR. pc_data = BN_UNHILITE
  597.           @ 7, 7 SAY 'EXE file name' COLOR n/w
  598.         CASE pc_data = BN_HILITE
  599.           @ 7, 7 SAY 'EXE file name' COLOR w+/w
  600.         CASE pc_data = BN_DISABLE
  601.           @ 7, 7 SAY 'EXE file name' COLOR n+/w
  602.         CASE pc_data = BN_COLOR
  603.           @ 7, 7 SAY "EXE ~file name" COLOR n/w
  604.       ENDCASE
  605.       IF pc_data <> BN_DISABLE
  606.         @ 7, 11 SAY "f" COLOR gr+/w
  607.       ENDIF
  608.   ENDCASE
  609.  
  610. RETURN
  611. *-- EOP: TStatic WITH pn_msg, pc_data, pnObject
  612.  
  613. PROCEDURE HasTitle
  614. PARAMETERS pnObject, pnWay
  615. *----------------------------------------------------------------------------
  616. * NAME
  617. *   HasTitle - Display the label for the group of objects
  618. *
  619. * DESCRIPTION
  620. *
  621. * PARAMETERS
  622. *   pnObject   = nCurrent value for group item
  623. *   pnWay      = BN_HILITE, BN_UNHILITE, or BN_DISABLE
  624. *
  625. *----------------------------------------------------------------------------
  626.   DO CASE
  627.     CASE pnObject = 7
  628.       DO TStatic WITH WM_PAINT, pnWay, 6
  629.     CASE pnObject = 13
  630.       DO TStatic WITH WM_PAINT, pnWay, 12
  631.     CASE pnObject = 19
  632.       DO TStatic WITH WM_PAINT, pnWay, 18
  633.  
  634.   ENDCASE
  635.  
  636. *-- EOP: HasTitle WITH pnObject, pnWay
  637.  
  638.  
  639.  
  640. FUNCTION GetMess
  641. *----------------------------------------------------------------------------
  642. * NAME
  643. *   GetMess() -
  644. * DEPENDENCIES
  645. *   Uses nCurrent to determine the wait state for the given object.
  646. *----------------------------------------------------------------------------
  647.   PRIVATE lRtn
  648.  
  649.   DO CASE
  650.     CASE nCurrent = 7                   && EF_EXEP_1
  651.       DO GetEdit
  652.     CASE nCurrent = 13                  && EF_CONF_1
  653.       DO GetEdit
  654.     CASE nCurrent = 19                  && EF_EXEF_1
  655.       DO GetEdit
  656.     CASE nCurrent = 26                  && BT_OK
  657.       DO GetWait
  658.     CASE nCurrent = 27                  && BT_CANCEL
  659.       DO TButton WITH WM_PAINT, BN_UNHILITE, 26
  660.       BT_CANCEL = .F.
  661.       DO GetWait
  662.     CASE nCurrent = 28                  && BT_HELP
  663.       DO TButton WITH WM_PAINT, BN_UNHILITE, 26
  664.       BT_HELP = .F.
  665.       DO GetWait
  666.   ENDCASE
  667.  
  668.   IF nMess = KB_F1
  669.     DO _HelpSys WITH cDialog, ;
  670.        LEFT( TRANSFORM( aObjPoint[ nCurrent ], "@L 99" ) + ;
  671.              aClkObj[ aObjPoint[ nCurrent ], 11 ], 10 ), ;
  672.        cHelpFile
  673.   ENDIF
  674.  
  675.   IF nMess = KB_ESC
  676.     lRtn = .T.
  677.   ELSE
  678.     lRtn = .F.
  679.   ENDIF
  680.  
  681. RETURN lRtn
  682. *-- EOF: GetMess(  )
  683.  
  684.  
  685. PROCEDURE GetWait
  686. *----------------------------------------------------------------------------
  687. * NAME
  688. *   GetWait -
  689. *
  690. * DESCRIPTION
  691. *
  692. *----------------------------------------------------------------------------
  693.   nMess = 0
  694.   nAccel = 0
  695.  
  696.   lButtAct = .T.
  697.   DO TButton WITH WM_PAINT, BN_HILITE, nCurrent
  698.  
  699.   SET CONSOLE OFF
  700.   SET CURSOR OFF
  701.   WAIT
  702.   SET CONSOLE ON
  703.  
  704.   nMess = LASTKEY()
  705.   nMRow = MROW()
  706.   nMCol = MCOL()
  707.  
  708. RETURN
  709. *-- EOP: GetWait
  710.  
  711.  
  712. PROCEDURE TButton
  713. PARAMETERS pn_msg, pc_data, pnObject
  714. *----------------------------------------------------------------------------
  715. * NAME
  716. *   TButton -
  717. *
  718. * DESCRIPTION
  719. *
  720. * PARAMETERS
  721. *   pn_msg     =
  722. *   pc_data    =
  723. *   pnObject   =
  724. *
  725. *----------------------------------------------------------------------------
  726.   DO CASE
  727.     CASE pnObject = 26                  && BT_OK
  728.       DO CASE
  729.         CASE pn_msg = WM_PAINT
  730.           DO CASE
  731.             CASE pc_data = BN_PAINT
  732.               @ 10, 11 SAY '   Ok   ' COLOR bg+/g
  733.             CASE pc_data = BN_HILITE
  734.               @ 10, 11 SAY '   Ok   ' COLOR w+/g
  735.             CASE pc_data = BN_UNHILITE
  736.               @ 10, 11 SAY '   Ok   ' COLOR n/g
  737.             CASE pc_data = BN_DEFAULT
  738.               @ 10, 11 SAY '   Ok   ' COLOR bg+/g
  739.             CASE pc_data = BN_DISABLE
  740.               @ 10, 11 SAY '   Ok   ' COLOR n+/g
  741.             CASE pc_data = SE_SHADOW
  742.               @ 11, 12 SAY "▀▀▀▀▀▀▀▀"
  743.               @ 10, 19 SAY "▄"
  744.             CASE pc_data = BN_PRESSED
  745.               @ 11, 12 SAY SPACE( 8 )
  746.               @ 10, 11 SAY " "
  747.               @ 10, 19 SAY " "
  748.               @ 10, 12 SAY '   Ok   ' COLOR w+/g
  749.           ENDCASE
  750.         CASE pn_msg = BN_CLICKED
  751.           DO TButton WITH WM_PAINT, BN_PRESSED, 26
  752.           x = INKEY( .2 )
  753.           nMess = DLN_OK
  754.           DO TButton WITH WM_PAINT, BN_PAINT, 26
  755.           DO TButton WITH WM_PAINT, SE_SHADOW, 26
  756.       ENDCASE
  757.  
  758.     CASE pnObject = 27                  && BT_CANCEL
  759.       DO CASE
  760.         CASE pn_msg = WM_PAINT
  761.           DO CASE
  762.             CASE pc_data = BN_PAINT
  763.               @ 10, 23 SAY ' Cancel ' COLOR n/g
  764.             CASE pc_data = BN_HILITE
  765.               @ 10, 23 SAY ' Cancel ' COLOR w+/g
  766.             CASE pc_data = BN_UNHILITE
  767.               @ 10, 23 SAY ' Cancel ' COLOR n/g
  768.             CASE pc_data = BN_DEFAULT
  769.               @ 10, 23 SAY ' Cancel ' COLOR bg+/g
  770.             CASE pc_data = BN_DISABLE
  771.               @ 10, 23 SAY ' Cancel ' COLOR n+/g
  772.             CASE pc_data = SE_SHADOW
  773.               @ 11, 24 SAY "▀▀▀▀▀▀▀▀"
  774.               @ 10, 31 SAY "▄"
  775.             CASE pc_data = BN_PRESSED
  776.               @ 11, 24 SAY SPACE( 8 )
  777.               @ 10, 23 SAY " "
  778.               @ 10, 31 SAY " "
  779.               @ 10, 24 SAY ' Cancel ' COLOR w+/g
  780.           ENDCASE
  781.         CASE pn_msg = BN_CLICKED
  782.           DO TButton WITH WM_PAINT, BN_PRESSED, 27
  783.           x = INKEY( .2 )
  784.           nMess = DLN_CANCEL
  785.           DO TButton WITH WM_PAINT, BN_PAINT, 27
  786.           DO TButton WITH WM_PAINT, SE_SHADOW, 27
  787.       ENDCASE
  788.  
  789.     CASE pnObject = 28                  && BT_HELP
  790.       DO CASE
  791.         CASE pn_msg = WM_PAINT
  792.           DO CASE
  793.             CASE pc_data = BN_PAINT
  794.               @ 10, 35 SAY '  Help  ' COLOR n/g
  795.             CASE pc_data = BN_HILITE
  796.               @ 10, 35 SAY '  Help  ' COLOR w+/g
  797.             CASE pc_data = BN_UNHILITE
  798.               @ 10, 35 SAY '  Help  ' COLOR n/g
  799.             CASE pc_data = BN_DEFAULT
  800.               @ 10, 35 SAY '  Help  ' COLOR bg+/g
  801.             CASE pc_data = BN_DISABLE
  802.               @ 10, 35 SAY '  Help  ' COLOR n+/g
  803.             CASE pc_data = SE_SHADOW
  804.               @ 11, 36 SAY "▀▀▀▀▀▀▀▀"
  805.               @ 10, 43 SAY "▄"
  806.             CASE pc_data = BN_PRESSED
  807.               @ 11, 36 SAY SPACE( 8 )
  808.               @ 10, 35 SAY " "
  809.               @ 10, 43 SAY " "
  810.               @ 10, 36 SAY '  Help  ' COLOR w+/g
  811.           ENDCASE
  812.         CASE pn_msg = BN_CLICKED
  813.           DO TButton WITH WM_PAINT, BN_PRESSED, 28
  814.           DO _HelpSys WITH cDialog, ;
  815.                 LEFT( TRANSFORM( aObjPoint[ nCurrent ], "@L 99" ) + ;
  816.                       aClkObj[ aObjPoint[ nCurrent ], 11 ], 10 ), ;
  817.                 cHelpFile
  818.           DO TButton WITH WM_PAINT, BN_PAINT, 28
  819.           DO TButton WITH WM_PAINT, SE_SHADOW, 28
  820.       ENDCASE
  821.  
  822.   ENDCASE
  823.  
  824. RETURN
  825. *-- EOP: TButton WITH pn_msg, pc_data, pnObject
  826.  
  827.  
  828. PROCEDURE GetEdit
  829. *----------------------------------------------------------------------------
  830. * NAME
  831. *   GetEdit -
  832. *
  833. * DESCRIPTION
  834. *
  835. *----------------------------------------------------------------------------
  836.   PRIVATE lSkipRead
  837.   lSkipRead = .F.
  838.   nMess = 0
  839.   nAccel = 0
  840.  
  841.   nMsEvent = 0
  842.   ON MOUSE DO MsHand WITH MROW(), MCOL()
  843.   DO SetOnKey
  844.  
  845.   DO CASE
  846.     CASE nCurrent = 7
  847.       @ 3, 23 GET EF_EXEP_1 PICTURE "XXXXXXXXXXXXXXXXXXXXXXXXX"
  848.     CASE nCurrent = 13
  849.       @ 5, 23 GET EF_CONF_1 PICTURE "XXXXXXXXXXXXXXXXXXXXXXXXX"
  850.     CASE nCurrent = 19
  851.       @ 7, 23 GET EF_EXEF_1 PICTURE "XXXXXXXXXXXXXXXXXXXXXXXXX"
  852.   ENDCASE
  853.  
  854.   IF .NOT. lSkipRead
  855.     SET CURSOR ON
  856.     READ
  857.     SET CURSOR OFF
  858.   ENDIF
  859.  
  860.   DO ClrOnKey
  861.   ON MOUSE
  862.  
  863.   IF .NOT. lSkipRead
  864.     IF nMsEvent = KB_MOUSE
  865.       nMess = KB_MOUSE
  866.     ELSE
  867.       nMess = LASTKEY()
  868.     ENDIF
  869.   ELSE
  870.     nMess = KB_DOWNARROW
  871.   ENDIF
  872.  
  873. RETURN
  874. *-- EOP: GetEdit
  875.  
  876.  
  877. PROCEDURE TEdit
  878. PARAMETERS pn_msg, p__data, pnObject
  879. *----------------------------------------------------------------------------
  880. * NAME
  881. *   TEdit -
  882. *
  883. * DESCRIPTION
  884. *
  885. * PARAMETERS
  886. *   pn_msg     =
  887. *   p__data    =
  888. *   pnObject   =
  889. *
  890. *----------------------------------------------------------------------------
  891.   DO CASE
  892.     CASE pnObject = 7                    && EF_EXEP_1
  893.       DO CASE
  894.         CASE p__data = EN_KILLFOC
  895.           @ 3, 23 GET EF_EXEP_1 PICTURE "XXXXXXXXXXXXXXXXXXXXXXXXX"
  896.           CLEAR GETS
  897.       ENDCASE
  898.  
  899.     CASE pnObject = 13                   && EF_CONF_1
  900.       DO CASE
  901.         CASE p__data = EN_KILLFOC
  902.           @ 5, 23 GET EF_CONF_1 PICTURE "XXXXXXXXXXXXXXXXXXXXXXXXX"
  903.           CLEAR GETS
  904.       ENDCASE
  905.  
  906.     CASE pnObject = 19                   && EF_EXEF_1
  907.       DO CASE
  908.         CASE p__data = EN_KILLFOC
  909.           @ 7, 23 GET EF_EXEF_1 PICTURE "XXXXXXXXXXXXXXXXXXXXXXXXX"
  910.           CLEAR GETS
  911.       ENDCASE
  912.  
  913.  
  914.   ENDCASE
  915.  
  916. RETURN
  917. *-- EOP: TEdit WITH pn_msg, p__data, pnObject
  918.  
  919. PROCEDURE SetOnKey
  920. *----------------------------------------------------------------------------
  921. * NAME
  922. *   SetOnKey - For each pick key, set on key label
  923. *
  924. * DESCRIPTION
  925. *
  926. *----------------------------------------------------------------------------
  927.  
  928.   ON KEY LABEL Alt-E DO AKeyHand WITH '7'
  929.   ON KEY LABEL Alt-C DO AKeyHand WITH '13'
  930.   ON KEY LABEL Alt-f DO AKeyHand WITH '19'
  931.  
  932. RETURN
  933. *-- EOP: SetOnKey
  934.  
  935.  
  936. PROCEDURE ClrOnKey
  937. *----------------------------------------------------------------------------
  938. * NAME
  939. *   ClrOnKey - For each pick key, clear on label
  940. *
  941. * DESCRIPTION
  942. *
  943. *----------------------------------------------------------------------------
  944.  
  945.   ON KEY LABEL Alt-E
  946.   ON KEY LABEL Alt-C
  947.   ON KEY LABEL Alt-f
  948.  
  949. RETURN
  950. *-- EOP: ClrOnKey
  951.  
  952.  
  953. PROCEDURE AKeyHand
  954. PARAMETERS cId
  955. *----------------------------------------------------------------------------
  956. * NAME
  957. *   AKeyHand - On key handler for Accel key from popup or get
  958. *
  959. * DESCRIPTION
  960. *
  961. * PARAMETERS
  962. *   nId        =
  963. *
  964. *----------------------------------------------------------------------------
  965.  
  966.   IF nAccel <> nCurrent
  967.     nAccel = VAL( cId )
  968.     KEYBOARD "{Ctrl-W}"
  969.     nMess = KB_CTRLW
  970.   ELSE
  971.     nAccel = 0
  972.   ENDIF
  973.  
  974. RETURN
  975. *-- EOP: AKeyHand WITH nId
  976.  
  977.  
  978. PROCEDURE CkWaitAc
  979. *----------------------------------------------------------------------------
  980. * NAME
  981. *   CkWaitAc - Look for Accel key from Wait command
  982. *
  983. * DESCRIPTION
  984. *   This routine has high International risk for translations.
  985. *----------------------------------------------------------------------------
  986.  
  987.   IF nMess < 0
  988.     nAccPress = nMess + 500
  989.   ELSE
  990.     IF nMess >= 97 .AND. nMess <= 122
  991.       nMess = nMess - 32
  992.     ENDIF
  993.     nAccPress = nMess
  994.   ENDIF
  995.  
  996.   DO CASE
  997.     CASE nAccPress = 69                  && E - EF_EXEP_0
  998.       nAccel = 7
  999.     CASE nAccPress = 67                  && C - EF_CONF_0
  1000.       nAccel = 13
  1001.     CASE nAccPress = 70                  && f - EF_EXEF_0
  1002.       nAccel = 19
  1003.     OTHERWISE
  1004.       nAccel = 0
  1005.   ENDCASE
  1006.  
  1007. RETURN
  1008. *-- EOP: CkWaitAc
  1009.  
  1010.  
  1011. FUNCTION GetMsTo
  1012. PARAMETER plChkOnly
  1013. *----------------------------------------------------------------------------
  1014. * NAME
  1015. *   GetMsTo() -
  1016. *
  1017. * DESCRIPTION
  1018. *
  1019. *----------------------------------------------------------------------------
  1020.  
  1021.   *-- Check for a click on the close button
  1022.   IF nMRow = nRowCls .AND. nMCol >= nLColCls .AND. nMCol <= nRColCls
  1023.     nMess = DLN_CANCEL
  1024.     nRtn = 0
  1025.   ELSE
  1026.     IF nMRow = nRowCls .AND. nMCol >= nCol .AND. nMCol <= nRWinCol
  1027.       *---------------------------------------------------------
  1028.       *-- All this to remove the shadow before moving the window
  1029.       *---------------------------------------------------------
  1030.       SAVE WINDOW BDCLINK TO _BDCLINK
  1031.       RELEASE WINDOW BDCLINK
  1032.       RESTORE SCREEN FROM BDCLINK
  1033.       RESTORE WINDOW BDCLINK FROM _BDCLINK
  1034.       ERASE _BDCLINK.win
  1035.       ACTIVATE WINDOW BDCLINK
  1036.  
  1037.       @ 0, 0 TO nHigh - 1, nWidth - 1 COLOR g+/w
  1038.       @ 0, 2 SAY "[ ]" COLOR g+/w
  1039.       @ 0, 3 SAY CHR( 254 ) COLOR g+/w
  1040.       @ 0, 17 SAY "[  Linker Options  ]" COLOR g+/w
  1041.  
  1042.       *-------------------------------
  1043.       *-- Start the move window action
  1044.       *-------------------------------
  1045.       nDelX = nMRow
  1046.       nDelY = nMCol
  1047.  
  1048.       SET CONSOLE OFF
  1049.       WAIT
  1050.       SET CONSOLE ON
  1051.  
  1052.       nMRow = MROW()
  1053.       nMCol = MCOL()
  1054.       nDelX = nMRow - nDelX
  1055.       nDelY = nMCol - nDelY
  1056.       lMoveOk = .T.
  1057.       ON ERROR lMoveOk = .F.
  1058.       MOVE WINDOW BDCLINK BY nDelX, nDelY
  1059.       ON ERROR
  1060.       IF lMoveOk
  1061.         nRowCls   = nRowCls + nDelX
  1062.         nCol      = nCol + nDelY
  1063.         nLColCls  = ncol + 2            && Left column for close button
  1064.         nRColCls  = ncol + 4            && End column for close button
  1065.         nRWinCol  = ncol + nWidth - 1   && Rigth column for window
  1066.         nXOffset  = nRowCls - nOrigRow
  1067.         nYOffset  = nCol    - nOrigCol
  1068.       ENDIF
  1069.  
  1070.       *---------------------------------------------------------
  1071.       *-- Display the new shadow for after moving the dialog box
  1072.       *---------------------------------------------------------
  1073.       SAVE WINDOW BDCLINK TO _BDCLINK
  1074.       RELEASE WINDOW BDCLINK
  1075.       RESTORE SCREEN FROM BDCLINK
  1076.       ACTIVATE SCREEN
  1077.       IF nCol + 54 < 80 .AND. nRowCls + 14 <= nScreen
  1078.         @ nRowCls + 1, nCol + 1 FILL TO nRowCls + 14, nCol + 54 COLOR n+/n
  1079.       ENDIF
  1080.       RESTORE WINDOW BDCLINK FROM _BDCLINK
  1081.       ERASE _BDCLINK.win
  1082.       ACTIVATE WINDOW BDCLINK
  1083.  
  1084.       @ 0, 0 TO nHigh - 1, nWidth - 1 DOUBLE COLOR w+/w
  1085.       @ 0, 2 SAY "[ ]" COLOR w+/w
  1086.       @ 0, 3 SAY CHR( 254 ) COLOR g+/w
  1087.       @ 0, 17 SAY "[  Linker Options  ]" COLOR w+/w
  1088.  
  1089.       nRtn = -1
  1090.     ELSE
  1091.       *-----------------------------------
  1092.       *-- Check for click on a live object
  1093.       *-----------------------------------
  1094.       nRtn = 0
  1095.       i = 1
  1096.       DO WHILE i <= nClkObj
  1097.         IF nMRow =  aClkObj[ i, 1 ] + nXOffSet .AND. ;
  1098.            nMCol >= aClkObj[ i, 2 ] + nYOffset .AND. ;
  1099.            nMCol <= aClkObj[ i, 3 ] + nYOffset
  1100.           nRtn = aClkObj[ i, 4 ]
  1101.           EXIT
  1102.         ENDIF
  1103.         i = i + 1
  1104.       ENDDO
  1105.  
  1106.       IF nRtn = 0
  1107.         *----------------------------------------------------------
  1108.         *-- Not found, check for a click in a Combo box or list box
  1109.         *----------------------------------------------------------
  1110.         IF nClkBox > 0
  1111.           i = 1
  1112.           DO WHILE i <= nClkBox
  1113.             IF nMRow >= aClkBox[ i, 1 ] + nXOffset .AND. ;
  1114.                nMRow <= aClkBox[ i, 1 ] + nXOffset + aClkBox[ i, 2 ] .AND. ;
  1115.                nMCol >= aClkBox[ i, 3 ] + nYOffset .AND. ;
  1116.                nMCol <= aClkBox[ i, 3 ] + nYOffset + aClkBox[ i, 4 ]
  1117.               nRtn = aClkBox[ i, 5 ] - 1
  1118.               aClkBox[ i, 6 ] = .T.
  1119.               EXIT
  1120.             ENDIF
  1121.             i = i + 1
  1122.           ENDDO
  1123.         ENDIF
  1124.       ENDIF
  1125.  
  1126.     ENDIF
  1127.   ENDIF
  1128.  
  1129. RETURN( nRtn )
  1130. *-- EOF: GetMsTo(  )
  1131.  
  1132.  
  1133. PROCEDURE MsHand
  1134. PARAMETERS pnMRow, pnMCol, pl_IsPop
  1135. *----------------------------------------------------------------------------
  1136. * NAME
  1137. *   MsHand -
  1138. *
  1139. * DESCRIPTION
  1140. *
  1141. * PARAMETERS
  1142. *   pnMRow     =
  1143. *   pnMCol     =
  1144. *   pl_IsPop   =
  1145. *
  1146. *----------------------------------------------------------------------------
  1147.   nMRow = pnMRow
  1148.   nMCol = pnMCol
  1149.   nMsEvent = KB_MOUSE
  1150.  
  1151.   KEYBOARD "{Ctrl-W}"
  1152.  
  1153. RETURN
  1154. *-- EOP: MsHand WITH pnMRow, pnMCol, pl_IsPop
  1155.  
  1156.  
  1157. PROCEDURE Dispatch
  1158. *----------------------------------------------------------------------------
  1159. * NAME
  1160. *   Dispatch -
  1161. *
  1162. * DESCRIPTION
  1163. *
  1164. *----------------------------------------------------------------------------
  1165.   DO CASE
  1166.     CASE nCurrent = 7                    && EF_EXEP_1
  1167.       DO DispEf
  1168.     CASE nCurrent = 13                   && EF_CONF_1
  1169.       DO DispEf
  1170.     CASE nCurrent = 19                   && EF_EXEF_1
  1171.       DO DispEf
  1172.     CASE nCurrent = 26                   && BT_OK
  1173.       DO DispBt
  1174.     CASE nCurrent = 27                   && BT_CANCEL
  1175.       DO DispBt
  1176.     CASE nCurrent = 28                   && BT_HELP
  1177.       DO DispBt
  1178.   ENDCASE
  1179.  
  1180. RETURN
  1181. *-- EOP: Dispatch
  1182.  
  1183.  
  1184. PROCEDURE DispBt
  1185. *----------------------------------------------------------------------------
  1186. * NAME
  1187. *   DispBt -
  1188. *
  1189. * DESCRIPTION
  1190. *
  1191. *----------------------------------------------------------------------------
  1192.   PRIVATE nPossNext
  1193.   DO CASE
  1194.     CASE nMess = KB_TAB
  1195.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1196.       DO GetNext WITH .T.
  1197.     CASE nMess = KB_SHIFTTAB
  1198.       DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1199.       DO GetNext WITH .F.
  1200.     CASE nMess = KB_ENTER
  1201.       DO TButton WITH BN_CLICKED, .F., nCurrent
  1202.     CASE nMess = KB_MOUSE
  1203.       nPossNext = GetMsTo()
  1204.       IF nPossNext > 0
  1205.         IF nPossNext = nCurrent
  1206.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1207.         ELSE
  1208.           DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1209.           DO GetNext WITH nPossNext, .F.
  1210.         ENDIF
  1211.       ENDIF
  1212.     OTHERWISE
  1213.       DO CkWaitAc
  1214.       IF nAccel > 0
  1215.         IF nAccel = nCurrent
  1216.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1217.         ELSE
  1218.           DO TButton WITH WM_PAINT, BN_UNHILITE, nCurrent
  1219.           DO GetNext WITH nAccel, .F.
  1220.         ENDIF
  1221.       ENDIF
  1222.   ENDCASE
  1223.  
  1224. RETURN
  1225. *-- EOP: DispBt
  1226.  
  1227.  
  1228. PROCEDURE DispEf
  1229. *----------------------------------------------------------------------------
  1230. * NAME
  1231. *   DispEf -
  1232. *
  1233. * DESCRIPTION
  1234. *
  1235. *----------------------------------------------------------------------------
  1236.   PRIVATE nPossNext
  1237.   DO CASE
  1238.     CASE nMess = KB_TAB
  1239.       DO GetNext WITH .T.
  1240.     CASE nMess = KB_SHIFTTAB
  1241.       DO GetNext WITH .F.
  1242.     CASE nMess = KB_ENTER
  1243.       IF nDlgDef > 0
  1244.         DO GetNext WITH nDlgDef
  1245.         IF nCurrent = nDlgDef
  1246.           DO TButton WITH BN_CLICKED, .F., nDlgDef
  1247.         ENDIF
  1248.       ENDIF
  1249.     CASE nMess = KB_UPARROW
  1250.       DO GetNext WITH .F., .T.
  1251.     CASE nMess = KB_DOWNARROW
  1252.       DO GetNext WITH .T., .T.
  1253.     CASE nMess = KB_MOUSE
  1254.       nPossNext = GetMsTo()
  1255.       IF nPossNext > 0
  1256.         DO GetNext WITH nPossNext, .F.
  1257.       ENDIF
  1258.     CASE nMess = KB_CTRLW .AND. nAccel > 0
  1259.       DO GetNext WITH nAccel, .F.
  1260.   ENDCASE
  1261.  
  1262. RETURN
  1263. *-- EOP: DispEf
  1264.  
  1265.  
  1266. PROCEDURE GetNext
  1267. PARAMETERS p__dir, pl_SameGrp
  1268. *----------------------------------------------------------------------------
  1269. * NAME
  1270. *   GetNext -
  1271. *
  1272. * DESCRIPTION
  1273. *
  1274. * PARAMETERS
  1275. *   p__dir     = .T. to go forward, .F. to go back, number to go to
  1276. *                record number.
  1277. *   pl_SameGrp = .F. to go to first item in next/prev group, .T. will
  1278. *                go to the next/prev item within the same group.  Only
  1279. *                applies to p__dir being next/previous.
  1280. *
  1281. *----------------------------------------------------------------------------
  1282.   PRIVATE cPrevClass, nWay, npCurrent, nPointer, nNextObj, nNextPtr
  1283.   PRIVATE nRecNo, npRecNo, lExit, cField, cVar, cCurrClass
  1284.  
  1285.   *------------------------------------------
  1286.   *-- Check for move out of the current group
  1287.   *------------------------------------------
  1288.   IF .NOT. pl_SameGrp
  1289.     IF TYPE( "p__dir" ) = "L"
  1290.       DO HasTitle WITH nCurrent, BN_UNHILITE
  1291.     ENDIF
  1292.   ENDIF
  1293.  
  1294.   cPrevClass = LEFT( aClkObj[ aObjPoint[ nCurrent ], 11 ], 3 )
  1295.  
  1296.  
  1297.   *----------------------------------------
  1298.   *-- Handle the forward and backward moves
  1299.   *----------------------------------------
  1300.   IF TYPE( "p__dir" ) = "L"
  1301.     DO CASE
  1302.       *-------------------------------------------
  1303.       *-- Go forward or backward in the same group
  1304.       *-------------------------------------------
  1305.       CASE  pl_SameGrp
  1306.         nWay = IIF( p__dir, 10, 9 )  && 10 Forward, 9 Back
  1307.         npCurrent = aObjPoint[ nCurrent ]
  1308.         nPointer = npCurrent
  1309.         *-----------------------------------------------
  1310.         *-- Is this a one item radio button or check box
  1311.         *-----------------------------------------------
  1312.         IF aClkObj[ npCurrent, 4 ] <> aClkObj[ npCurrent, nWay ]
  1313.           DO WHILE .T.
  1314.             *------------------------------------------------------
  1315.             *-- Check to see if the next object's WHEN clause is Ok
  1316.             *------------------------------------------------------
  1317.             nNextObj = aClkObj[ nPointer, nWay ]
  1318.             IF WhenOk( nNextObj )
  1319.               nPointer = aObjPoint[ nNextObj ]
  1320.               EXIT
  1321.             ELSE
  1322.               *-----------------------------------------------
  1323.               *-- See if we looped back to the item we were on
  1324.               *-----------------------------------------------
  1325.               nNextPtr  = aObjPoint[ nNextObj ]
  1326.               IF nNextPtr = npCurrent
  1327.                 EXIT
  1328.               ELSE
  1329.                 nPointer = nNextPtr
  1330.               ENDIF
  1331.             ENDIF
  1332.           ENDDO
  1333.         ENDIF
  1334.         IF nPointer <> npCurrent
  1335.           nCurrent = aClkObj[ nPointer, 4 ]
  1336.           nCurrGrp = aClkObj[ nPointer, 5 ]
  1337.         ENDIF
  1338.       OTHERWISE
  1339.         nWay = IIF( p__dir, 6, 7 )  && 6 Forward, 7 Back
  1340.         nRecNo = nCurrent
  1341.         npRecNo = aObjPoint[ nRecNo ]
  1342.         lExit = .F.
  1343.         DO WHILE aClkObj[ npRecNo, 5 ] = nCurrGrp
  1344.           nRecNo = aClkObj[ npRecNo, nWay ]
  1345.           npRecNo = aObjPoint[ nRecNo ]
  1346.           IF aClkObj[ npRecNo, 5 ] = nCurrGrp
  1347.             LOOP
  1348.           ELSE
  1349.             *--------------------------------------------------
  1350.             *-- Finally, we have moved out of the current group
  1351.             *--------------------------------------------------
  1352.             nCurrGrp = aClkObj[ npRecNo, 5 ]
  1353.             IF .NOT. WhenOk( nRecNo )
  1354.               LOOP
  1355.             ELSE
  1356.               nCurrent = nRecNo
  1357.               lExit = .T.
  1358.             ENDIF
  1359.           ENDIF
  1360.           IF lExit
  1361.             EXIT
  1362.           ENDIF
  1363.         ENDDO
  1364.  
  1365.         DO HasTitle WITH nCurrent, BN_HILITE
  1366.  
  1367.     ENDCASE
  1368.  
  1369.   ELSE
  1370.  
  1371.     *-------------------------------------------------------
  1372.     *-- Handle direct moves to objects via Alt key and Mouse
  1373.     *-------------------------------------------------------
  1374.     IF .NOT. WhenOk( p__dir )
  1375.       nMess = 0
  1376.       RETURN
  1377.     ENDIF
  1378.  
  1379.  
  1380.     IF nCurrGrp <> aClkObj[ aObjPoint[ p__dir ], 5 ]
  1381.       DO HasTitle WITH nCurrent, BN_UNHILITE
  1382.       DO HasTitle WITH p__dir, BN_HILITE
  1383.       nCurrent = p__dir
  1384.       nCurrGrp = aClkObj[ aObjPoint[ nCurrent ], 5 ]
  1385.       DO CASE
  1386.         CASE nCurrent = 26
  1387.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1388.         CASE nCurrent = 27
  1389.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1390.         CASE nCurrent = 28
  1391.           DO TButton WITH BN_CLICKED, .F., nCurrent
  1392.       ENDCASE
  1393.     ELSE
  1394.       DO HasTitle WITH p__dir, BN_HILITE
  1395.     ENDIF
  1396.     nCurrent = p__dir
  1397.     nCurrGrp = aClkObj[ aObjPoint[ nCurrent ], 5 ]
  1398.  
  1399.   ENDIF
  1400.  
  1401.   *---------------------------------------------------------------
  1402.   *-- Repaint the Default button if we were on a button before and
  1403.   *-- the target is not a button.
  1404.   *---------------------------------------------------------------
  1405.   cCurrClass = LEFT( aClkObj[ aObjPoint[ nCurrent ], 11 ], 3 )
  1406.   IF cPrevClass = "BT_" .AND. cCurrClass <> "BT_"
  1407.     DO TButton WITH WM_PAINT, BN_DEFAULT, nDlgDef
  1408.     STORE .T. TO BT_OK
  1409.   ENDIF
  1410.  
  1411. RETURN
  1412. *-- EOP: GetNext WITH p__dir, pl_SameGrp
  1413.  
  1414.  
  1415. FUNCTION WhenOk
  1416. PARAMETERS pnTarget
  1417. *----------------------------------------------------------------------------
  1418. * NAME
  1419. *   WhenOk - Validate the WHEN condition for a target object
  1420. *
  1421. * DESCRIPTION
  1422. *
  1423. * PARAMETERS
  1424. *   pnTarget   = Object ID to verify against
  1425. *
  1426. *----------------------------------------------------------------------------
  1427.   PRIVATE lWhenOk
  1428.   lWhenOk = .T.
  1429.  
  1430.  
  1431. RETURN lWhenOk
  1432. *-- EOF: WhenOk( pnTarget )
  1433.  
  1434.  
  1435. FUNCTION GetId
  1436. PARAMETERS pcVar
  1437. *----------------------------------------------------------------------------
  1438. * NAME
  1439. *   GetId() - Search for memvar name and return current_id
  1440. *----------------------------------------------------------------------------
  1441.   PRIVATE nId
  1442.   nId = 0
  1443.  
  1444.   DO CASE
  1445.     CASE pcVar = "EF_EXEP_0"
  1446.       nId = 6
  1447.     CASE pcVar = "EF_EXEP_1"
  1448.       nId = 7
  1449.     CASE pcVar = "EF_CONF_0"
  1450.       nId = 12
  1451.     CASE pcVar = "EF_CONF_1"
  1452.       nId = 13
  1453.     CASE pcVar = "EF_EXEF_0"
  1454.       nId = 18
  1455.     CASE pcVar = "EF_EXEF_1"
  1456.       nId = 19
  1457.     CASE pcVar = "BT_OK"
  1458.       nId = 26
  1459.     CASE pcVar = "BT_CANCEL"
  1460.       nId = 27
  1461.     CASE pcVar = "BT_HELP"
  1462.       nId = 28
  1463.   ENDCASE
  1464.  
  1465. RETURN( nId )
  1466. *-- EOF: GetId( pcVar)
  1467.  
  1468.  
  1469. PROCEDURE PostVals
  1470. *----------------------------------------------------------------------------
  1471. * NAME
  1472. *   PostVals -
  1473. *
  1474. * DESCRIPTION
  1475. *
  1476. *----------------------------------------------------------------------------
  1477.  
  1478.   IF TYPE( "BDCLINK[1]" ) <> "U"
  1479.  
  1480.     BDCLINK[ 1 ] = EF_EXEP_1
  1481.     BDCLINK[ 2 ] = EF_CONF_1
  1482.     BDCLINK[ 3 ] = EF_EXEF_1
  1483.     BDCLINK[ 4 ] = BT_OK
  1484.     BDCLINK[ 5 ] = BT_CANCEL
  1485.     BDCLINK[ 6 ] = BT_HELP
  1486.  
  1487.   ENDIF
  1488.  
  1489. RETURN
  1490. *-- EOP: PostVals
  1491.  
  1492. PROCEDURE ReleObjs
  1493. *----------------------------------------------------------------------------
  1494. * NAME
  1495. *   ReleObjs - Scan the design DBF file and release the object variables
  1496. *
  1497. * DESCRIPTION
  1498. *
  1499. *----------------------------------------------------------------------------
  1500.  
  1501. RETURN
  1502. *-- EOP: ReleObjs
  1503.  
  1504.  
  1505. PROCEDURE IBDCLINK
  1506. *----------------------------------------------------------------------------
  1507. * NAME
  1508. *   IBDCLINK  - Builds the Initialization array for this dialog box
  1509. *
  1510. * DESCRIPTION
  1511. *   IBDCLINK with create a routine that you can call or cut from this
  1512. *   file to run a dialog box and capture the data on exit.
  1513. *
  1514. *   To run the dialog box,
  1515. *     SET PROCEDURE TO BDCLINK
  1516. *     DO IBDCLINK
  1517. *   Running IBDCLINK with use the defaults from the SCR file.  The
  1518. *   array will remain in memory after execution.
  1519. *
  1520. *   REMEMBER, REGENERATING THE DIALOG BOX WILL OVERWRITE THIS PROCEDURE!
  1521. *
  1522. *----------------------------------------------------------------------------
  1523.  
  1524.   PUBLIC ARRAY BDCLINK[ 6 ]
  1525.     *-- EF_EXEP_1 - XXXXXXXXXXXXXXXXXXXXXXXXX
  1526.     BDCLINK[ 1 ]     = SPACE( 25 )
  1527.  
  1528.     *-- EF_CONF_1 - XXXXXXXXXXXXXXXXXXXXXXXXX
  1529.     BDCLINK[ 2 ]     = SPACE( 25 )
  1530.  
  1531.     *-- EF_EXEF_1 - XXXXXXXXXXXXXXXXXXXXXXXXX
  1532.     BDCLINK[ 3 ]     = SPACE( 25 )
  1533.  
  1534.     *-- BT_OK -    Ok
  1535.     BDCLINK[ 4 ]     = .T.
  1536.  
  1537.     *-- BT_CANCEL -  Cancel
  1538.     BDCLINK[ 5 ]     = .F.
  1539.  
  1540.     *-- BT_HELP -   Help
  1541.     BDCLINK[ 6 ]     = .F.
  1542.  
  1543.   *--------------------------------------------------------------
  1544.   *-- FXL_Cancel is set to .T. is the user Cancels the dialog box
  1545.   *--------------------------------------------------------------
  1546.   FXL_Cancel = .F.
  1547.  
  1548.   *--------------------------------------------------------------
  1549.   *-- FXL_NoChng lets the dialog box know that the values in the
  1550.   *-- array are not different from the SCR file defaults.  This
  1551.   *-- will allow the dialog box to use the .WIN file for a faster
  1552.   *-- startup.
  1553.   *--------------------------------------------------------------
  1554.   FXL_NoChng = .T.
  1555.  
  1556.   DO BDCLINK
  1557.  
  1558.   IF .NOT. FXL_Cancel                   && The user clicked on OK
  1559.  
  1560.     *-----------------------------------
  1561.     *-- Put your Ok processing code here
  1562.     *-----------------------------------
  1563.  
  1564.   ENDIF
  1565.  
  1566.   RELEASE BDCLINK
  1567.  
  1568. RETURN
  1569. *-- EOP: IBDCLINK
  1570.